feat(work): watch the work list on a live kanban board - #249
Merged
Merged
Conversation
Adds `spinloop work board`: four state columns re-read from the work list API on a cadence, with detail-and-log-tail, in-place add form, abort and confirm-before-remove — all through the API alone, so refusals read the way the API states them. A client of the work list API only, and it refuses a pipe in favour of `work list`. Closes #246
added 6 commits
September 26, 2026 01:27
An action woken its spinner repaint chain by calling prog.Send from inside Update. The loop reads that channel on the very goroutine running Update, so the send blocked forever and the whole board went deaf — the last Enter on the add form was one way to hit it. The chain is now scheduled as the second command of the action's batch, the pattern the fleet dashboard already rides; the program expands it in a goroutine of its own, and the tick handler keeps it restacking until the call answers. Tests drive commands through one wbLand helper: it unwraps the batch to the call, folds the answer in, and lands the follow-up read; wbAct and wbRound wrap it for their shapes. The teatest smoke now lands an abort through the real loop, where the batch is expanded as in the binary — the wiring the directly-driven tests never reached because they leave send unwired.
The why row was emitted as one line and clipped at the frame, so a long reason lost its tail — the part an operator opens the detail to read. It now wraps under the label's room, the red kept on every row; the log pane gives the height back through the same field count that sizes it.
Instructions wrapped to the width but nothing capped the field section's height: a long enough instruction pushed the log pane and the esc-back footer past the terminal's bottom edge, unreachable in a view without scrolling. The fields now answer the same discipline the log pane already kept — keep what fits, and a dim note counts the rows left behind rather than hiding them unseen. One detailLayout computation feeds the view and the tail's buffer, so neither can hold what the frame cannot draw.
…change The detail's contract now says what the pane actually owes: instructions and failure reason wrapped to the frame rather than clipped, a record taller than the terminal truncated honestly with a note counting the rows left behind, and the keys kept on screen. design and tasks describe the shipped Batch pattern, not the prog.Send chain that deadlocked the loop; internals records that trap for the next TUI.
# Conflicts: # docs/maintainer/internals.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
spinloop work board: a full-screen kanban of a running orchestrator's work list — add items, tail their logs, abort runs and clear failures without leaving the screen.Summary
enter) shows the whole item — full instructions, dir, tags, timings, failure reason — with its kept output tailed beneath exactly aswork logs -ftails it.n) — a modal over the live board with all five fields at once; the API stays the only judge of an item's shape, and its refusal stands in the form for a corrected send.a) and remove (x, with a confirm) ride the same API paths the one-shot commands call; refusals read on the status line the way the API states them.spinloop work list.docs/commands/work.md, cross-links from the work-items guide and the commands index, CHANGELOG entry. Closes feat: add TUI kanban board #246.Implementation details
charmbracelet/bubblesis taken on for itstextinputalone (blink off — a standing surface must stay byte-stable); the grid, cards, detail and hints stay hand-rolled.tea.KeyMsgs over anhttptestfake API (the API's real refusals, and a call log that proves the negatives: declined removals sent nothing); oneteatestsmoke drives an abort through the real program loop to prove theprog.Sendspin-chain wiring no direct test can reach.